package app

import (
	"github.com/sirupsen/logrus"
	"os"
	"path"
	"time"
)

type Clog struct {
	Logger *logrus.Logger
	Config string
}

var logs = make(map[string]*Clog)

// 获取Log链接
func Log(config ...string) *Clog {
	defaultConfig := "main"
	if len(config) > 0 && config[0] != "" {
		defaultConfig = config[0]
	}

	// 存在就返回
	if _, ok := logs[defaultConfig]; ok {
		return logs[defaultConfig]
	}

	// 生成一个
	clog := new(Clog)
	clog.Logger = logrus.New()
	clog.Config = defaultConfig

	// 初始化
	clog.InitLogger(defaultConfig)
	logs[defaultConfig] = clog

	return clog
}

// 初始化日志
func (c *Clog) InitLogger(configKey string) {
	logConfig, errLogConfig := Config.GetLogConfig(configKey)
	if errLogConfig != nil {
		panic(errLogConfig.Error())
	}

	var logFileName string
	if logConfig.LogFileType == "daily" {
		logFileName = time.Now().Format("2006-01-02") + ".log"
	} else {
		logFileName = logConfig.LogFileName
	}

	// 目录是否存在 不存在则创建
	logDir := logConfig.LogFileDir + "/" + logConfig.LogFilePath
	if has, _ := PathExist(logDir); !has {
		err := os.Mkdir(logDir, os.ModePerm)
		if err != nil {
			panic("创建日志目录-" + logDir + "-失败," + err.Error())
			return
		}
	}

	// 文件是否存在 不存在则创建
	fileName := path.Join(logDir, logFileName)

	var src *os.File
	var errPath error
	var errOpen error
	// 文件不存在　则创建
	if has, _ := PathExist(fileName); !has {
		src, errPath = os.OpenFile(fileName, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
		if errPath != nil {
			panic("创建日志文件-" + fileName + "-失败," + errPath.Error())
			return
		}
	} else {
		// 写入文件
		src, errOpen = os.OpenFile(fileName, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
		if errOpen != nil {
			panic("打开日志文件-" + fileName + "-失败," + errOpen.Error())
			return
		}
	}

	// 设置输出
	c.Logger.Out = src

	// 设置日志级别
	c.Logger.SetLevel(logrus.DebugLevel)

	// 设置日志格式
	c.Logger.SetFormatter(&logrus.TextFormatter{})

	return
}

// info
func (c *Clog) Info(msg interface{}) {
	c.Logger.Info(msg)
}

func (c *Clog) Error(msg interface{}) {
	c.Logger.Error(msg)
}

// 文件是否存在
func PathExist(path string) (bool, error) {
	_, err := os.Stat(path)

	if err == nil {
		return true, nil
	}

	if os.IsNotExist(err) {
		return false, nil
	}

	return false, err
}
